package com.buymobile.components.page;

import java.io.Serializable;
import java.util.List;

/**
 * <pre>
 *  用来在分页查询，其作用是将当前查询的某一页的信息，
 *  如上一页、下一页、总共多少页等信息存储下来，并提供友好的接口给用户
 *  另外，也提供了转载用户序列化对象的把手：userObject
 * </pre>
 */
public class Page implements Serializable {

	/**
	 * Comment for <code>serialVersionUID</code>
	 */
	private static final long serialVersionUID = 3258689914320533045L;

	private List<?> userObjects;

	private int index;

	private int pageSize;

	private int rowCount;

	/**
	 * 
	 * @param index
	 *            当前要查询的页码
	 * @param pageSize
	 *            每页显示的行数
	 */
	public Page(int index, int pageSize) {
		this.index = index;
		this.pageSize = pageSize;
		if (index <= 0)
			this.index = 1;
		if (pageSize <= 0)
			this.pageSize = 1;
	}

	/**
	 * 返回当前查询的页码
	 * 
	 * @return 返回当前查询的页码
	 */
	public int getIndex() {
		return index;
	}

	/**
	 * 得到当前每页显示的行数
	 * 
	 * @return 每页显示的行数
	 */
	public int getPageSize() {
		return pageSize;
	}

	/**
	 * 设置当前满足查询条件时返回的总行数
	 * 
	 * @param rowCount
	 *            总行数
	 * @throws IllegalArgumentException
	 *             rowCount必需大于零
	 */
	public void setRowCount(int rowCount) {
		if (rowCount < 0)
			throw new IllegalArgumentException(
					"the rowCount param must be greater or equal than zero");
		this.rowCount = rowCount;
	}

	/**
	 * 总行数
	 * 
	 * @return 总行数
	 */
	public int getRowCount() {
		return rowCount;
	}

	/**
	 * 得到当前查询的总页数
	 * 
	 * @return 总页数
	 */
	public int getPageCount() {
		int pageCount = (rowCount + pageSize - 1) / pageSize;
		return pageCount == 0 ? 1 : pageCount;
	}

	/**
	 * 相对当前页(index)的下一页
	 * 
	 * @return 下一页
	 */
	public int getNextPage() {
		return (index + 1) > getPageCount() ? getPageCount() : (index + 1);
	}

	/**
	 * 相对当前页(index)的上一页
	 * 
	 * @return 上一页
	 */
	public int getPrePage() {
		return (index - 1) < 1 ? 1 : (index - 1);
	}

	public List<?> getUserObjects() {
		return userObjects;
	}

	public void setUserObjects(List<?> userObjects) {
		this.userObjects = userObjects;
	}
}
